package com.hsgene.order.persistence;

import com.hsgene.order.condition.OrderMallCondition;
import com.hsgene.order.domain.*;
import com.hsgene.order.dto.OrderMallDto;
import com.hsgene.order.dto.OrderMallItemDto;
import com.hsgene.order.dto.OrderMallItemInvoiceDto;
import com.hsgene.order.dto.OrderMallItemSupplementDto;
import com.hsgene.order.dto.details.*;
import com.hsgene.order.domain.OrderMallItemSupplementSample;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 商城订单Repository
 *
 * @author wangbing
 * @version 1.0, 2018/8/3
 */
@Repository
public interface OrderMallRepository {

    /**
     * 保存订单信息
     *
     * @param orderMall 订单信息
     */
    void save(@Param("orderMall") OrderMall orderMall);

    /**
     * 更新订单信息
     *
     * @param orderMall 订单信息
     */
    void updateOrderMall(@Param("orderMall") OrderMall orderMall);

    /**
     * 保存订单发票信息
     *
     * @param invoice 发票信息
     */
    void saveOrderMallInvoice(@Param("invoice") OrderMallInvoice invoice);

    /**
     * 保存子订单信息
     *
     * @param items 子订单信息
     */
    void saveOrderMallItems(@Param("items") List<OrderMallItemBasic> items);

    /**
     * 查询总订单下所有子订单
     *
     * @param mainOrderId 总订单id
     * @return 子订单信息
     */
    List<OrderMallItemBasic> queryOrderMallItems(@Param("mainOrderId") String mainOrderId);

    /**
     * 更新子订单信息
     *
     * @param item 子订单信息
     */
    void updateOrderMallItem(@Param("item") OrderMallItemBasic item);

    /**
     * 保存订单相关优惠信息
     *
     * @param discounts 优惠信息
     */
    void saveOrderMallDiscounts(@Param("discounts") List<OrderMallDiscounts> discounts);

    /**
     * 保存订单患者信息
     *
     * @param supplements 患者信息
     */
    void saveOrderSupplements(@Param("supplements") List<OrderMallItemSupplement> supplements);

    /**
     * 查询总订单信息
     *
     * @param orderId 订单编号
     * @return 总订单信息
     */
    OrderMall findOrderMall(@Param("orderId") String orderId);

    /**
     * 保存订单付款信息
     *
     * @param payment 支付信息
     */
    void saveOrderPayment(@Param("payment") OrderMallPayment payment);

    /**
     * 根据流水号查询支付信息
     *
     * @param serialNumber 支付流水号
     * @return 订单支付信息
     */
    OrderMallPayment findOrderPayment(@Param("serialNumber") String serialNumber);

    /**
     * 更新支付信息
     *
     * @param payment 支付信息
     */
    void updateOrderPayment(@Param("payment") OrderMallPayment payment);

    /**
     * jcl
     * 查询用户订单数量
     *
     * @param orderMallCondition
     * @return 订单数量
     */
    List<Integer> getUserOrderCount(@Param("orderMallCondition") OrderMallCondition orderMallCondition);

    /**
     * jcl
     * 查询订单数量
     *
     * @param orderMallCondition
     * @return 订单数量
     */
    int getOrderItemCount(@Param("orderMallCondition") OrderMallCondition orderMallCondition);

    /**
     * jcl
     * 获取用户不同状态的订单信息
     *
     * @param orderMallCondition 查询条件
     * @return 总订单信息
     */
    List<OrderMallDto> getUserOrders(@Param("orderMallCondition") OrderMallCondition orderMallCondition);

    /**
     * jcl
     * 查询订单下的子订单
     *
     * @param mainOrderId 总订单id
     * @return 子订单信息
     */
    List<OrderMallItemDto> getOrderMallItemByOrderId(@Param("mainOrderId") String mainOrderId);

    /**
     * 查询总订单下的子订单数量
     *
     * @param mainOrderId 总订单id
     * @return 子订单数量
     */
    int getOrderMallItemCountByOrderId(@Param("mainOrderId") String mainOrderId);

    /**
     * jcl
     * 查询商城订单列表
     *
     * @param orderMallCondition 查询条件
     * @return 商城订单信息
     */
    List<OrderMallItemDto> getOrderMallItemPage(@Param("orderMallCondition") OrderMallCondition orderMallCondition);

    /**
     * jcl
     * 查询排除某个状态的订单数量
     *
     * @param orderMallCondition 被排除条件
     * @return
     */
    int getExcludeOrderStatusOrderMallCount(@Param("orderMallCondition") OrderMallCondition orderMallCondition);

    /**
     * jcl
     * 查询排除某个状态的订单列表信息
     *
     * @param orderMallCondition 被排除条件
     * @return
     */
    List<OrderMallItemDto> getExcludeOrderStatusOrderMall(@Param("orderMallCondition") OrderMallCondition
                                                                  orderMallCondition);

    /**
     * 获取订单详情
     *
     * @param itemOrderId 订单id
     * @return
     */
    OrderDetailsDto getOrderDetailsByOrderId(@Param("itemOrderId") String itemOrderId);

    /**
     * jcl
     * 获取子订单补充信息
     *
     * @param itemOrderId 子订单id
     * @return 补充信息
     */
    OrderMallItemSupplementDto getOrderItemSupplement(@Param("itemOrderId") String itemOrderId);

    /**
     * 根据补充信息id删除其对应的样本类型
     *
     * @param supplementId
     * @return
     */
    int deleteSupplementSample(@Param("supplementId") Long supplementId);

    /**
     * 订单补充信息样本类型
     *
     * @param supplementSamples
     * @return
     */
    int insertSupplementSample(List<OrderMallItemSupplementSample> supplementSamples);

    /**
     * jcl
     * 更新子订单补充信息
     *
     * @param orderMallItemSupplement
     * @return
     */
    int updateOrderItemSupplement(@Param("orderMallItemSupplement") OrderMallItemSupplement orderMallItemSupplement,
                                  @Param("type") String type);

    /**
     * jcl
     * 更新发货状态
     *
     * @param orderMallItemBasic
     * @return
     */
    int deliverGoods(@Param("orderMallItemBasic") OrderMallItemBasic orderMallItemBasic);

    /**
     * 编辑子订单信息
     *
     * @param editInfoDto 编辑信息
     * @return
     */
    boolean editOrderDetails(@Param("editInfoDto") OrderDetaulsEditInfoDto editInfoDto);

    /**
     * 子订单、主订单更新状态
     *
     * @param orderId   订单id
     * @param status    状态
     * @param tableName 表名
     * @return
     */
    boolean orderStatusUpdate(@Param("orderId") String orderId, @Param("status") String status, @Param
            ("tableName") String tableName, @Param("columnName") String columnName);

    /**
     * 更新订单的过期时间
     *
     * @param deadline 时间戳
     * @return
     */
    boolean orderDeadlineUpdate(@Param("deadline") long deadline, @Param("id") String id);

    /**
     * jcl
     * 查询订单发票信息
     *
     * @param mainOrderId 总订单id
     * @return 发票信息
     */
    OrderMallItemInvoiceDto getOrderMallItemInvoice(@Param("mainOrderId") String mainOrderId);

    /**
     * jcl
     * 添加发票信息
     *
     * @param orderMallInvoice 订单发票信息
     * @return
     */
    int insertOrderItemInvoice(@Param("orderMallInvoice") OrderMallItemInvoice orderMallInvoice);

    /**
     * 待支付订单详情
     *
     * @param orderId 订单详情
     * @return
     */
    ObligationOrderDetailsInfo getObligationOrderDetailsInfo(@Param("orderId") String orderId);

    /**
     * 查询订单回收站中的订单数量
     *
     * @param orderMallCondition 查询条件
     * @return 数量
     */
    List<Integer> orderRecycleCount(@Param("orderMallCondition") OrderMallCondition orderMallCondition);

    /**
     * 查询订单回收站数据
     *
     * @param orderMallCondition 查询条件
     * @return 订单
     */
    List<OrderMallDto> orderRecycles(@Param("orderMallCondition") OrderMallCondition orderMallCondition);
}
